home *** CD-ROM | disk | FTP | other *** search
/ NetNews Offline 2 / NetNews Offline Volume 2.iso / news / comp / lang / c-part1 / 7982 < prev    next >
Encoding:
Internet Message Format  |  1996-08-05  |  3.9 KB

  1. Path: anvil.ugrad.cs.ubc.ca!not-for-mail
  2. From: c2a192@ugrad.cs.ubc.ca (Kazimir Kylheku)
  3. Newsgroups: comp.lang.c
  4. Subject: Re: const char??
  5. Date: 28 Feb 1996 10:45:18 -0800
  6. Organization: Computer Science, University of B.C., Vancouver, B.C., Canada
  7. Message-ID: <4h27ruINN4lo@anvil.ugrad.cs.ubc.ca>
  8. References: <31287436.1235873@news.inforamp.net> <TANMOY.96Feb20095538@qcd.lanl.gov> <4gqflgINN1kq@keats.ugrad.cs.ubc.ca> <825454039snz@genesis.demon.co.uk>
  9. NNTP-Posting-Host: anvil.ugrad.cs.ubc.ca
  10.  
  11. In article <825454039snz@genesis.demon.co.uk>,
  12. Lawrence Kirby  <fred@genesis.demon.co.uk> wrote:
  13.  >In article <4gqflgINN1kq@keats.ugrad.cs.ubc.ca>
  14.  >           c2a192@ugrad.cs.ubc.ca "Kazimir Kylheku" writes:
  15.  >
  16.  >>        int * const x;
  17.  >>
  18.  >>The trick is to see the declaration of the type, and the further declarators of
  19.  >>objects derived from the type as separate syntactic units. Immediate
  20.  >>understanding is thereafter forthcoming. :)
  21.  >
  22.  >I'll take your word on that! :-)
  23.  >
  24.  >> >(There is a related issue that the function may also change *x by
  25.  >> >using the lvalue *(char*)x. That, and similar tricks, are so bad
  26.  >> >programming practices, that I won't even comment on them!)
  27.  >>
  28.  >>Hmm. Is that not a bit of an error, since the const modifier is being dropped
  29.  >>in the cast? C allows you to only safely convert pointers of any type to void *
  30.  >>and back to the same type. I will have to check references whether or not that
  31.  >>"type" is so restrictive as to include any modifiers like const and volatile.
  32.  >
  33.  >6.3.4 
  34.  >
  35.  >"It is guaranteed, however, that a pointer to an object of a given alignment
  36.  > may be converted to a pointer to an object of the same alignment or less
  37.  > strict alignment and back again; the result shall compare equal to original
  38.  > pointer."
  39.  >
  40.  >6.1.2.5
  41.  >
  42.  >"The qualified or unqualified versions of a type are distinct types that
  43.  > belong to the same type category and have the same representation and
  44.  > alignment requirements."
  45.  >
  46.  >
  47.  >So you can certainly cast between pointers to differently qualified versions
  48.  >of the same type and back again. More simply I take:
  49.  
  50. Given that text, one can easily put ``two and two together'' from those
  51. paragraphs.  Thanks for answering that one. I feel just a tad more
  52. knowledgeable about C, yet again.
  53.  
  54.  >6.3.4
  55.  >
  56.  >"A pointer to an object or incomplete type may be converted to a pointer
  57.  > to a different object type or a different incomplete type. The resulting
  58.  > pointer might not be valid if it is improperly aligned for the type
  59.  > pointed to."
  60.  >
  61.  >to mean that if the result *is* properly aligned (as in this case) then
  62.  >the result is valid.
  63.  
  64. You probably can, if they intended to write ``if and only if'', which they
  65. probably did intend.
  66.  
  67.  >>In any case, the cast does make it explicit that you are trying to voluntarily
  68.  >>break the const. But in your function declaration you promised that you would
  69.  >>not touch the object---why go through the bother of making that promise to the
  70.  >>caller, when you intend to violate it?
  71.  >
  72.  >The cast doesn't necessarily violate the promise. Consider writing an
  73.  >implementation of strchr() in C. The prototype is:
  74.  >
  75.  >char *strchr(const char *s, int c);
  76.  >
  77.  >It returns a pointer derived from s or NULL. Somewhere within this function
  78.  >you are going to have to convert from const char * to char *. This function
  79.  >does break the 'chain of constness' and if you pass it a const char * value
  80.  >you should ensure that you assign the return value to a const char * variable.
  81.  >To get around this strchr() would have had to return an offset rather than
  82.  >a pointer.
  83.  
  84. Ah, I see. That makes sense, since strchr() has to manufacture a pointer
  85. somewhere along the line, through which access to the string s could take
  86. place. What if it is done immediately in the return statement of strchr()? As
  87. in:
  88.  
  89.     return (char *) x;    /* x is (const char *)    */
  90.  
  91. That's one way to write the function which ensures that it never has in its
  92. possession a pointer through which the string could be legally modified.
  93. -- 
  94.  
  95.